/*
Programa de Tiago Falcao RA046802
*/
#include <stdio.h>
#include "comandos.h"
#include "imagem.h"


/* Carrega o arquivo filename e devolve a estrutura Image em img.
 * Retorna false se nao for possivel carregar a imagem, true c.c. */
boolean comando_carrega_imagem(char *filename, Image **img) {
  *img=ReadImage(filename);
  if(*img){
	  return true;
  }else{
	  return false;
  }
}

/* Imprime a imagem img no formato PGM P2.
 * Retorna false se nao for possivel imprimir a imagem, true c.c. */
boolean comando_imprime_imagem(Image *img) {
	if(img){
		PrintImage(img);
  		return true;
	}else{
		return false;
	}
}

/* Imprime a imagem img no formato PGM P2.
 * Retorna false se nao for possivel imprimir a imagem, true c.c. */
boolean comando_movimenta_imagem(Image *img) {
	if(img){
		MovImage(img);
		return true;
	}else{
		return false;
	}
}

/* Libera a imagem da memoria.
 * Apos liberar a memoria com sucesso, a variavel *img deve apontar
 * para NULL.
 * Retorna false se a imagem for invalida e nao for possivel liberar
 * a memoria, true c.c. */
boolean comando_libera_imagem(Image **img) {
	if(*img){
		DestroyImage(img);
		return true;
	}else{
		return false;
	}
}

/* Imprime o histograma normalizado da imagem, com precisao
 * de 4 casas decimais (%.4f). Os valores devem ser separados por
 * um espaco em branco.
 * Retorna false se nao for possivel calcular o histograma, true c.c. */
boolean comando_imprime_histograma(Image *img) {
	float * vet;         //<---------------possivel fonte de erros
	int c=0;
	if(!img){return false;} 
	vet=Histogram(img);
	while(c<256){
		printf("%.4f ",vet[c]);
		c++;
		if(c==255){
			printf("%.4f",vet[c]);
			c++;
		}
	}
	printf("\n");
	free(vet);
  return true;
}

/* Imprime o histograma normalizado acumulado da imagem, com
 * precisao de 4 casas decimais (%.4f). Os valores devem ser
 * separados por um espaco em branco.
 * Retorna false se nao for possivel calcular o histograma, true c.c. */
boolean comando_imprime_histograma_acumulado(Image *img) {
	float * vet;         //<---------------possivel fonte de erros
	int c=0;
	if(!img){return false;} 
	vet=AccHistogram(img);
	while(c<256){
		printf("%.4f ",vet[c]);
		c++;
		if(c==255){
			printf("%.4f",vet[c]);
			c++;
		}
	}
	printf("\n");
	free(vet);
	return true;
}

/* Equaliza o histograma da imagem.
 * Retorna false se nao for possivel equalizar o histograma, true c.c. */
boolean comando_equaliza_histograma(Image *img) {
	if(img){
		HistogramEqualization(img);
 		return true;
	}else{
		return false;
	}
}

/* Calcula o negativo da imagem.
 * Retorna false se nao for possivel calcular o negativo, true c.c. */
boolean comando_negativo_imagem(Image *img) {
	if(img){
		Negative(img);
		return true;
	}
	return false;
}

/* Limiariza a imagem.
 * Retorna false se nao for possivel limiarizar a imagem, true c.c. */
boolean comando_limiariza_imagem(Image *img, int thr) {
	if(img){
		Threshold(img,thr);
		return true;
	}
	return false;
}

/* Imprime o valor medio de brilho da imagem, usando precisao
 * de quatro casas decimais (%.4f).
 * Retorna false se nao for possivel calcular a media, true c.c. */
boolean comando_media_brilho(Image *img) {
	if(img){
		printf("%.4f\n",MeanValue(img));
		return true;
	}
  return false;
}

/* Recorta um retangulo indicado pelas posicoes (x0,y0) no canto
 * superior esquerdo e (x1,y1) no canto inferior direiro. A
 * variavel *img devera apontar para a nova imagem.
 * Retorna false se nao for possivel recortar um retangulo, true c.c. */
boolean comando_recorta_retangulo(Image **img, int x0, int y0,int x1, int y1) {
	int aux;
	Image * nova;
	if(!img){return false;}
	if(x1<x0){
		aux=x0;
		x0=x1;
		x1=aux;
	}
	if(y1<y0){
		aux=y0;
		y0=y1;
		y1=aux;
	}
	nova=CropRectangle(*img,x0,y0,x1,y1);
	DestroyImage(img);
	*img=nova;
  return true;
}

/*BBE foi utilizado nesse programa*/
